package com.xuxu.simple;


import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;


/**
 * 简单的RabbitMQ生产者
 *
 * 创建Rabbit生产者的步骤
 *  1.创建连接工厂
 *    1.1 设置主机地址：默认为localhost
 *    1.2 设置连接端口：默认为5672，使用浏览器访问的端口是15672
 *    1.3 设置虚拟主机：默认/
 *    1.3 连接用户名：默认为guest
 *    1.4 连接密码： 默认为guest
 *  2.创建连接
 *  3.创建频道
 *  4.创建(声明)队列
 *  5.准备要发送的信息
 *  6.发送消息
 *  7.关闭资源
 *
 *
 */
public class Producer {
    //定义静态变量队列名称 QUEUE_NAME => 简单的队列
    static final String QUEUE_NAME = "simple_queue";

    public static void main(String[] args) throws Exception {
        //1.创建连接工厂对象
        ConnectionFactory connectionFactory = new ConnectionFactory();
        //设置主机地址
        connectionFactory.setHost("localhost"); //本地主机
        //设置端口号
        connectionFactory.setPort(5672);
        //设置虚拟主机
        connectionFactory.setVirtualHost("/xuxu");
        //设置用户名
        connectionFactory.setUsername("xuxu");
        //设置密码
        connectionFactory.setPassword("123");
        
        //2.通过连接工厂，创建连接对象
        Connection connection = connectionFactory.newConnection();

        //3.通过创建的连接，创建频道 channel
        Channel channel = connection.createChannel();

        //4.通过频道 channel ，创建队列
        /*
            第一个参数：队列的名称
            第二个参数：是否持久化队列
            第三个参数：是否独占队列
            第四个参数：是否在不使用的时候删除队列
            第五个参数：其他参数，是一个map集合
         */
        channel.queueDeclare(QUEUE_NAME,true,false,false,null);

        //5.准备要发送的消息
        String message = "你好啊，这是RabbitMQ 消息";

        //6.发送消息 调用队列对象中的 基本的发送消息的方法 basicPublish()
        /*
            第一个参数：交换机的名称，如果没有默认使用 DefaultExchange，写的时候写空字符串""
            第一个参数：路由key，在简单模式中 使用队列的名称
            第一个参数：消息的其他属性
            第一个参数：消息内容
         */
        channel.basicPublish("",QUEUE_NAME,null,message.getBytes());

        System.out.println("发送消息成功，消息的内容是：  "+message);

        //7.关闭资源
        //关闭频道
        channel.close();
        //关闭连接对象
        connection.close();

    }

}
